﻿
#include<iostream>
using namespace std;
//class A
//{
//public:
//    virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//    virtual void test() { func(); }
//};
//
//class B : public A
//{
//public:
//    void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};
//
//int main(int argc, char* argv[])
//{
//    B* p = new B;
//    p->test();
//    return 0;
//}


//#include<iostream>
//class A
//{
//public:
//    virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//    virtual void test() { func(); }
//};
//
//class B : public A
//{
//public:
//    virtual void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};
//
//int main(int argc, char* argv[])
//{
//    B* p = new B;
//    p->func();
//    return 0;
//}


//class A
//{
//public:
//    virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//    virtual void test() { func(); }
//};
//
//class B : public A
//{
//public:
//    virtual void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};
//
//int main(int argc, char* argv[])
//{
//    A* p = new B;
//    p->func();
//    return 0;
//}


//class A
//{
//public:
//    virtual void func1(int val = 1) { std::cout << "func1->" << val << std::endl; }
//    virtual void func2(int val = 2) { std::cout << "func2->" << val << std::endl; }
//    /*virtual void test() { func(); }*/
//};
//
//class B : public A
//{
//public:
//    virtual void func1(int val = 0) { std::cout << "func1->" << val << std::endl; }
//    virtual void func2(int val = 0) { std::cout << "func2->" << val << std::endl; }
//    virtual void func3(int val = 0) { std::cout << "func3->" << val << std::endl; }
//    virtual void func4(int val = 0) { std::cout << "func4->" << val << std::endl; }
//};
//
//typedef void(*VF_ptr)();
//
//void PrintVFTable(VF_ptr* vTable)
//{
//    cout << " 虚表地址>" << vTable << endl;
//    for (int i = 0; vTable[i] != nullptr; ++i)
//    {
//        printf(" 第%d个虚函数地址 :0X%x,->", i, vTable[i]);
//        VF_ptr f = vTable[i];
//        f();
//    }
//    cout << endl;
//
//}
//
//int main(int argc, char* argv[])
//{
//    //A* p = new B;
//    //p->func();
//
//    A _a;
//    B _b;
//    //A* p = new B;
//    //p->func2();
//    VF_ptr* vTable_a = (*(VF_ptr**)(&_a));
//    PrintVFTable(vTable_a);
//    VF_ptr* vTable_b = (*(VF_ptr**)(&_b));
//    PrintVFTable(vTable_b);
//
//
//    return 0;
//}




//class A
//{
//public:
//    virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//};
//class B : public A
//{
//public:
//    virtual void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};
//int main(int argc, char* argv[])
//{
//    A* p = new B;
//    p->func();
//    return 0;
//}

//using namespace std;
//﻿class A
//
//{
//
//public:
//
//  void f() { cout << "A::f()" << endl; }
//
//  int a;
//
//};
//
//
//
//class B : public A
//
//{
//
//public:
//
//	void f(int a) { cout << "B::f()" << endl; }
//
//	int a;
//
//};
//
//
//
//int main()
//
//{
//
//	B b;
//
//	b.f();
//
//	return 0;
//
//}

//class Base1 { public:int _b1; };
//
//class Base2 { public: int _b2; };
//
//					class Derive : public Base1, public Base2
//
//					{
//					public: int _d;
//					};
//
//
//
//					int main() {
//
//
//
//						Derive d;
//
//						Base1* p1 = &d;
//
//						Base2* p2 = &d;
//
//						Derive* p3 = &d;
//						printf("%p\n", p1);
//						printf("%p\n", p2);
//						printf("%p\n", p3);
//
//						return 0;
//
//					}

//class Base1 { public:  int _b1; };
//class Base2 { public:  int _b2; };
//class Derive : public Base1, public Base2 { public: int _d; };
//int main() {
//	Derive d;
//	Base1* p1 = &d;
//	Base2* p2 = &d;
//	Derive* p3 = &d;
//
//	return 0;
//}

//class Base1
//{
//public:
//	virtual void fun1(){}
//	virtual void fun2(){}
//	int _a;
//};
//
//
//class Base2
//{
//public:
//	virtual void fun1() {}
//	virtual void fun2() {}
//	int _b;
//};
//
//class Derive :public Base1,public Base2
//{
//public:
//	virtual void fun1() {}
//	virtual void fun3() {}
//};
//
//int main()
//{
//	Derive d;
//	Base1* ptr1 = &d;
//	Base2* ptr2 = &d;
//	Derive* ptr3 = &d;
//	printf("%p\n", ptr1);
//	printf("%p\n", ptr2);
//	printf("%p\n", ptr3);
//	return 0;
//}


//class A { public:  void test(int a = 1) { cout << a; } }; 
//class B :public A { public: void test(int b ) { cout << b; } }; 
//void main() { A* a = new A; B* b = new B; a = b; a->test(); }

//class Base1 { public: int _b1; };
//class Base2 { public: int _b2; };
//class Derive : public Base1, public Base2 { public: int _d; };
//int main()
//{
//Derive d;
//Base1* p1 = &d;
//Base2* p2 = &d;
//Derive* p3 = &d;
//printf("%p\n", p1);
//printf("%p\n", p2);
//printf("%p\n", p3);
//return 0;
//}



//class A
//
//{
//
//public:
//
//    virtual void f()
//
//    {
//
//        cout << "A::f()" << endl;
//
//    }
//
//};
//
//
//
//class B : public A
//
//{
//
//private:
//
//    virtual void f()
//
//    {
//
//        cout << "B::f()" << endl;
//
//    }
//
//};
//
//
//int main()
//{
//    A* pa = (A*)new B;
//
//    pa->f();
//    return 0;
//}

class A
{
public:

	A() :m_iVal(0) { test(); }

	virtual void func() { std::cout << m_iVal << ' '; }

	void test() { func(); }

public:

	int m_iVal;
};

class B : public A

{

public:

	B() { test(); }

	virtual void func()

	{

		++m_iVal;

		std::cout << m_iVal << ' ';

	}

};

int main(int argc, char* argv[])

{

	A* p = new B;

	p->test();

	return 0;

}